package py.com.sole.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;

import py.com.sole.dao.DaoFactory;
import py.com.sole.dao.ProfesorDao;
import py.com.sole.dto.ProfesorPersonaDTO;
import py.com.sole.model.Profesor;
import py.com.sole.model.TipoDocumento;

public class ProfesorImpl implements ProfesorDao {

  EntityManager em = DaoFactory.getEm();
  private static final Logger logger = Logger.getLogger(ProfesorDao.class);

  @Override
  public Profesor addProfesor(Profesor profesor) {
    try {
      EntityTransaction etx = em.getTransaction();
      etx.begin();
      em.persist(profesor);
      etx.commit();
      em.refresh(profesor);
      return profesor;
    } catch (Exception e) {
      logger.error("No se pudo insertar el profesor " + e);
      return null;
    }
  }

  @Override
  public void deleteProfesor(int id) {
    // TODO Auto-generated method stub
    try {
      em.getTransaction().begin();
      em.remove(this.getProfesorById(id));
      em.getTransaction().commit();
    } catch (Exception e) {

    }

  }

  @Override
  public void updateProfesor(Profesor profesor) {
    // TODO Auto-generated method stub
    try {
      em.getTransaction().begin();
      em.merge(this.getProfesorById(profesor.getId()));
      em.getTransaction().commit();
    } catch (Exception e) {
      // TODO: handle exception
    }

  }

  @SuppressWarnings(value = "all")
  public List<Profesor> getProfesores() {
    // TODO Auto-generated method stub
    return em.createQuery("SELECT p FROM Profesor p where p.activo=TRUE").getResultList();

  }

  @Override
  public Profesor getProfesorById(int id) {
    // TODO Auto-generated method stub
    return (Profesor) em.createQuery(
      "SELECT p FROM Profesor p where p.id = " + id).getSingleResult();

  }

  @Override
  public Profesor getProfesorByName(String value) {
    // TODO Auto-generated method stub
    try {
      Query q = em.createNamedQuery("Profesor.findByDescripcion");
      q.setParameter("descripcion", value);
      return (Profesor) q.getSingleResult();
    } catch (Exception e) {
      logger.error("Error al obtener el profesor [getProfesorByName] :" + e);
      return null;
    }

  }

  @Override
  public List<Profesor> getProfesorByFilter(TipoDocumento tipoDocu, String nombre, String apellido, String nroDocu) {

    List<Profesor> profesores = new ArrayList<Profesor>();
    List<Object[]> listObject = new ArrayList<Object[]>();

    if (nombre.equalsIgnoreCase("") && apellido.equalsIgnoreCase("") && nroDocu.equalsIgnoreCase("")) {
      return null;
    }

    String q = "SELECT \n"
      + "    pr.id,"
      + "    p.nombre, \n"
      + "    p.apellido, \n"
      + "    p.telefono,\n"
      + "    p.email,\n"
      + "    d.descripcion,\n"
      + "    p.documento,\n"
      + "    t.descripcion\n"
      + "    m.descripcion\n"
      + "FROM \n"
      + "    Profesor pr left join pr.persona p\n"
      + "    left join p.direccion d,\n"
      + "    p.tipoDocumentoId t,\n"
      + "    m.materiaId t\n"
      + "WHERE \n"
      + "    and t = :tipoDocumento,\n"
      + "    and m = :materia\n";
    if (!nombre.equals("")) {
      q = q + "    and p.nombre = :nombre\n";
    }

    if (!apellido.equals("")) {
      q = q + "    and p.apellido = :apellido\n";
    }
    q = q + "    and p.documento = :documento";
    try {
      Query query = em.createQuery(q);

      query.setParameter("tipoDocumento", tipoDocu);

      if (!nombre.equalsIgnoreCase("")) {
        query.setParameter("nombre", nombre);
      }

      if (!apellido.equalsIgnoreCase("")) {
        query.setParameter("apellido", apellido);
      }

      listObject = query.getResultList();
      for (Object[] objects : listObject) {
        Profesor profesor = this.getProfesorById(Integer.parseInt(objects[0].toString()));
        profesores.add(profesor);
      }

    } catch (Exception e) {
      logger.error("No se pudo obtener la lista de padres [getProfesorByFilter]: " + e);
      return null;
    }

    return profesores;
  }

  @SuppressWarnings(value = "all")
  public List<ProfesorPersonaDTO> getProfesorPersona() {
    // TODO Auto-generated method stub

    List<ProfesorPersonaDTO> listProfesor = new ArrayList<ProfesorPersonaDTO>();
    try {
      List<Object[]> listObject = em.createNamedQuery("Profesor.findProfesorPersona").getResultList();
      for (Object[] objects : listObject) {
        ProfesorPersonaDTO profesor = new ProfesorPersonaDTO();
        profesor.setId(Integer.parseInt(objects[0].toString()));
        profesor.setNombre((objects[1] != null) ? objects[1].toString() : "");
        profesor.setApellido((objects[2] != null) ? objects[2].toString() : "");
        profesor.setTelefono((objects[3] != null) ? objects[3].toString() : "");
        profesor.setEmail((objects[4] != null) ? objects[4].toString() : "");
        listProfesor.add(profesor);
      }
    } catch (Exception e) {
      logger.error("Ocurrio un error al intentar obtener profesores [getProfesorPersona]" + e.getMessage());

    }

    return listProfesor;

  }
}
